#ifndef TEMPORIZACAO
#define TEMPORIZACAO

#include <stdio.h>
#include <time.h>
#include <sys/time.h>
#include <string.h>

typedef struct {
	struct timeval inicio, fim;
	clock_t cTime;
	clock_t eTime;
} timeBundle;

/* declaracao global (fora do main) */
clock_t cpuTime, elapsedTime;
struct timeval tp0, tp1;
char sTime[200];		/* strings para formatar o tempo em hora:min:seg.mseg */


/* startTiming(&t1) starts measuring CPU and Elapsed time relative to t1. */
void startTiming(timeBundle *tb);

/* stopTiming(&t1); stops measuring the CPU and Elapsed time relative to t1.
   Requires a previous call to startTiming(&t1)
*/
void stopTiming(timeBundle *tb);

/* formatTimeBundle(&t1, s); formats the timeBundle t1 as "ElapsedTime(CPUTime)"
   each as "hour:min:sec.msec.usec" in string s.
   Uses the smallest possible string.
   Requires previous calls to startTiming(&t1); and stopTiming(&t1); 
   Returns the number of chars in s (not including the trailing '\0'.
*/
int formatTimeBundle(timeBundle *tb, char *s);

/* Inicia temporizacao de uso da CPU.  Em multicores, os tempos sao somados.
   O resultdo da temporizacao inclui os tempos de CPU de todos os cores utilizados.
*/
void CPUTimingStart();

/* Termina temporizacao de tempo de CPU
*/
void CPUTimingStop();

/* Termina temporizacao de tempo de CPU e Imprime os resultados no formato
   hora:min:seg.mseg.useg
*/
void CPUTimingStopAndPrint(char *mess);

/* Inicia temporizacao
*/
void ElapsedTimingStart();

/* Termina temporizacao
*/
void ElapsedTimingStop();

/* Termina temporizacao e Imprime os resultados no formato hora:min:seg.mseg.useg
*/
void ElapsedTimingStopAndPrint(char *mess);

/* formataTempo: retorna string contendo o tempo t (originalmente em microsegundos)
   no formato hora:min:seg.mseg.useg
*/
char *formatTime(char *s, clock_t t);

/* Imprimi time no fomrmato hora:min:seg.mseg.useg.  Se COUNT estiver definido,
   imprimi # function calls cf/1000, # comparisons cc/1000, # operations co/1000,
  and # comparisons + operations (cc+c0)/1000
*/
void printTime(char *mess, clock_t time);

/* Exemplo de uso das funcoes para temporizacao
#include "formataTempo.h"
int main(void) {
	ElapsedTimingStart();
	CPUTimingStart();
	
	// insira aqui os comandos a ser temporizados ...
	dummy();
	CPUTimingStopAndPrint("dummy() CPU time:");
	ElapsedTimingStopAndPrint("dummy() elapsed time:");
}
*/
#endif
